package br.com.sgc.session;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import br.com.sgc.dao.AgendamentoDao;
import br.com.sgc.entities.geral.Agendamento;
import br.com.sgc.entities.geral.PacienteAnimal;
import br.com.sgc.entities.geral.PacientePessoa;
import br.com.sgc.entities.medico.Medico;
import br.com.sgc.enuns.StatusAgendamento;
import br.com.sgc.enuns.TipoClinica;
import br.com.sgc.exception.ValidacaoException;

@Stateless
public class AgendamentoSession extends GenericSession<Agendamento>{

	
	
	private static final long serialVersionUID = 2991012200095140931L;
	
	
	@EJB private AgendamentoDao dao;
	
	@EJB private PacienteAnimalSession pacienteAnimalSession;
	
	@EJB private PacientePessoaSession pacientePessoaSession;
	
	public List<Agendamento> findAgendamentosByDate(Date dataInicial, Date dataFinal, Long medicoId, Long idClinica){
		return dao.findAgendamentosByDate(dataInicial, dataFinal, medicoId, idClinica);
	}
	
	@Override
	public Agendamento save(Agendamento t) throws ValidacaoException {
		if(t.getSala() == null || t.getSala().getId() == null){
			t.setSala(null);
		}
		
		if(t.getFuncionario() == null || t.getFuncionario().getId() == null){
			t.setFuncionario(null);
		}
		if(!t.getTipoProcedimento().getExibirMedicos()){
			t.setMedico(null);
		} 

		if (!t.getTipoProcedimento().getExibirTratamentos()){
			t.setTratamento(null);
		}
		
		if(t.getClinica().getTipoClinica().equals(TipoClinica.VETERINARIA)){
			t.setPaciente(pacienteAnimalSession.findPacienteByAnimalId(((PacienteAnimal)t.getPaciente()).getAnimal().getId()));
		} else {
			t.setPaciente(pacientePessoaSession.findPacienteByPessoaId(((PacientePessoa)t.getPaciente()).getPessoa().getId()));
		}
		
		return super.save(t);
	}
	
	public void validarAgendamento(Agendamento agendamento) throws ValidacaoException, ParseException{
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Date dataCorrente = sdf.parse(sdf.format(new Date()));
		Date dataAgendamento = sdf.parse(sdf.format(agendamento.getDataAgendamento()));
		
		if(dataAgendamento.before(dataCorrente)){
			throw new ValidacaoException("Esta consulta não ser atendida pois a data de consulta é anterior a data atual!");
		}
		
		if(dataAgendamento.after(dataCorrente)){
			throw new ValidacaoException("A data da consulta é posterior a data atual!");
		}
		
		if(agendamento.getStatusAgendamento().equals(StatusAgendamento.CONCLUIDO)){
			throw new ValidacaoException("Esta consulta já foi finalizada");
		}
	}

	public List<Agendamento> findAllByMedicoDia(Medico medico, Date date) {
		return dao.findAllByMedicoDia(medico, date);
	}
	
}
